NodeJs
Node.js 是如何工作的?
- 客户端向
Web
服务器发送请求以与Web
应用程序交互。请求可以是非阻塞的或阻塞的:- 查询数据
- 删除数据
- 更新数据
Node.js
检索传入请求并将其添加到事件队列- 然后,请求通过事件循环一一传递。它检查请求是否足够简单,不需要任何外部资源。
- 事件循环处理简单的请求(非阻塞操作),例如
I/O
轮询,并将响应返回给相应的客户端。
线程池中的单个线程被分配给单个复杂请求。该线程负责通过访问外部资源(例如计算、数据库、文件系统等)来完成特定的阻塞请求。
任务完成后,响应将发送到事件循环,事件循环将该响应发送回客户端。
单线程如何处理并发?
NodeJS
平台没有遵循多线程请求/响应无状态模型,它遵循单线程事件循环模型。NodeJS
处理范例深受 JavaScript
基于事件的模型和 JavaScript
回调系统的影响。因此,Node.js
可以轻松管理更多并发客户端请求。事件循环是 Node.js
中处理模型的心脏。
理解回调
在给定任务之后调用回调函数。它允许其他代码同时运行并防止任何阻塞。作为一个异步平台,Node.js
严重依赖回调。Node
的所有 API
都是为了支持回调而编写的。
可以用 Promise
来替代,因为 异步逻辑的控制流程更加明确和结构化
耦合度低
我们有内置的错误处理
提高了可读性
。
什么是 I/O
- 术语
I/O
用于描述将数据传输到一个介质或从另一个介质传输数据的任何程序、操作或设备。 - 每次传输都是一种介质的输出和另一种介质的输入。介质可以是物理设备、网络或系统内的文件。
内置模块
核心模块 | 描述 |
---|---|
HTTP | 包含用于创建 Node.js HTTP 服务器的类、方法和事件 |
util | 包涵对开发人员有用的实用函数 |
fs | 包括处理文件 I/O 操作的事件、类和方法 |
url | 包括 URL 解析方法 |
query string | 包括使用查询字符串的方法 |
stream | 包括处理流数据的方法 |
zlib | 包括压缩或解压缩文件的方法 |
事件驱动编程
事件驱动的编程方法使用事件来触发各种功能。事件可以是任何事件,例如键入按键或单击鼠标按钮。回调函数已经注册到元素中,每当触发事件时就会执行。
事件循环
事件循环处理 Node.js 中的异步回调。它是 Node.js 中非阻塞输入/输出的基础,使其成为最重要的环境特性之一。
process.nextTick() 和 setImmediate() 的区别
首先说结论,process.nextTick
比 setImmediate
会先执行,且 process.nextTick
在一轮循环中会执行掉所有的函数,setImmediate
一次循环只会执行一个。就像 微任务
和 宏任务
的差别。
在 node
中,所有的异步任务都会有一个观察者,操作系统会询问这个观察者这个异步任务执行完了没有,如果执行完了我就执行你对应的回调函数了,如果没执行完,那没关系,我下个循环再来问你。
而操作系统询问观察者是有顺序的,观察者分为 idle观察者
、check观察者
和 I/O观察者
,每一轮循环检查中,询问观察者的顺序是 idel观察者
> I/O观察者
> check观察者
,而 process.nextTick
属于 idel
观察者, setImmediate
属于 check
观察者,所以 process.nextTick
会先执行。
EventEmitter
EventEmitter
是一个类,包含所有可以发出事件的对象
每当 EventEmitter
类中的对象抛出事件时,就会同步调用所有附加函数
API 函数有哪两种类型
异步、非阻塞函数 同步、阻塞功能
流
流是使您能够连续读取数据或写入数据的对象。
- 有四种类型的流:
- Readable——用于读取操作
- Writable -用于写操作
- Duplex -可用于读取和写入操作
- Transform -一种双工流,其中输出是根据输入计算的